import { ButtonProps } from '@/components/GlobalButton/interface';
import { FieldNamesProps, HeaderRenderScope, RenderScope, SearchProps, TypeProps } from '@/components/ProTable/interface';
import { TableColumnCtx } from 'element-plus';
import { Ref, VNode } from 'vue';

interface publicParams {
  type: 'get' | 'post';
}

export interface configTable {
  // 表格列
  columns?: ColumnProps[];
  // 初始化参数
  initParam?: any;
  // 组件ref
  ref: Ref<any>;
  // 请求表格数据
  requestApi?: ConfigPageApiParamsProps;
  // 表格头部按钮
  headButtonList?: ButtonProps[];
  // 行内按钮
  rowButtonList?: ButtonProps[];
}

interface ColumnProps<T = any> extends Partial<Omit<TableColumnCtx<T>, 'type' | 'children' | 'renderCell' | 'renderHeader'>> {
  type?: TypeProps; // 列类型
  tag?: boolean; // 是否是标签展示
  isShow?: boolean | Ref<boolean>; // 是否显示在表格当中
  permissionCode?: string; // 权限控制是否显示该字段
  search?: SearchProps | undefined; // 搜索项配置
  enum?: ConfigPageEnumProps; // 枚举字典
  isFilterEnum?: boolean | Ref<boolean>; // 当前单元格值是否根据 enum 格式化（示例：enum 只作为搜索项数据）
  fieldNames?: FieldNamesProps; // 指定 label && value && children 的 key 值
  headerRender?: (scope: HeaderRenderScope<T>) => VNode; // 自定义表头内容渲染（tsx语法）
  render?: (scope: RenderScope<T>) => VNode | string; // 自定义单元格内容渲染（tsx语法）
  _children?: ColumnProps<T>[]; // 多级表头
}
export interface ConfigPageEnumProps {
  // 字典 | 接口 | 静态数据
  type: 'dict' | 'api' | 'options';
  // 静态数据 type = options 时必填
  options?: ConfigPageEnumProps[];
  // 字典请求的code,type = dict 时必填
  dictCode?: string;
  // api请求参数 type = api 时必填
  apiParams?: ConfigPageApiParamsProps;
  // 显示的label字段 字典|接口时必填
  label?: string;
  // 显示的value字段 字典|接口时必填
  value?: string;
}

export interface ConfigPageApiParamsProps {
  // 接口类型
  type: publicParams['type'];
  // 接口地址
  url: string;
  // 接口请求参数
  data?: any;
  // 需要验证的字段
  validationField: string;
}

interface ButtonProps {
  label: ButtonProps['label'];
  icon?: ButtonProps['icon'];
  tooltip?: ButtonProps['tooltip']; // 鼠标放上提示
  type?: ButtonProps['type'];
  permissionCode?: ButtonProps['permissionCode'];
  loading?: ButtonProps['loading'];
  display?: ButtonProps['display'];
  hideIConArrow?: ButtonProps['hideIConArrow'];
  attrs?: ButtonProps['attrs'];
  trigger?: ButtonProps['trigger'];
  children?: ButtonProps[];
  methods?: ButtonMethods;
}

interface ButtonMethods {
  // ElMessageBox 消息弹框
  type: 'ElMessageBox';
  elMessageBoxParams: ElMessageBoxParamsProps;
}

// 消息弹框参数
interface ElMessageBoxParamsProps {
  // 消息弹框标题
  title: string;
  // 接口类型
  type: publicParams['type'];
  // 接口地址
  url: string;
  // 接口请求参数
  data?: any;
}
